package com.le.tester.javaThink.fifth.chapter24_ConcurrentProgramming;

import java.util.concurrent.CompletableFuture;

/**
 * createTime：2021/8/20 17:49
 * description：模拟蛋糕制作
 */
public class Batter {
    static class Eggs {
    }

    static class Milk {
    }

    static class Sugar {
    }

    static class Flour {
    }

    static <T> T prepare(T ingredient) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e.getMessage());
        }
        return ingredient;
    }

    static <T> CompletableFuture<T> prep(T ingredient) {
        return CompletableFuture.completedFuture(ingredient).thenApplyAsync(Batter::prepare);


    }

    public static CompletableFuture<Batter> mix() {
        CompletableFuture<Eggs> eggs = prep(new Eggs());

        CompletableFuture<Milk> milk = prep(new Milk());

        CompletableFuture<Sugar> sugar = prep(new Sugar());

        CompletableFuture<Flour> flour = prep(new Flour());

        CompletableFuture.allOf(eggs, milk, sugar, flour)
                .join();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e.getMessage());
        }

        return CompletableFuture.completedFuture(new Batter());


    }
}
